package cn.tsingmo.otproxy.client;

import cn.tsingmo.otproxy.security.KeyManager;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 客户端连接处理器
 * 处理客户端与服务端的连接和数据交互
 */
public class ClientConnectionHandler extends ChannelInboundHandlerAdapter {
    private static final Logger logger = LoggerFactory.getLogger(ClientConnectionHandler.class);
    // 目标服务器地址
    private final String targetHost;
    // 目标服务器端口
    private final int targetPort;

    /**
     * 构造函数
     * @param targetHost 目标服务器地址
     * @param targetPort 目标服务器端口
     */
    public ClientConnectionHandler(String targetHost, int targetPort) {
        this.targetHost = targetHost;
        this.targetPort = targetPort;
    }

    /**
     * 当客户端与服务端连接建立成功后调用
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        logger.info("客户端已连接到代理服务端");
        // 发送认证令牌
        String authToken = KeyManager.getAuthToken();
        ctx.writeAndFlush(authToken.getBytes());
    }

    /**
     * 当从服务端收到数据时调用
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        try {
            byte[] data = (byte[]) msg;
            logger.info("收到服务端数据，长度: {}", data.length);
            // TODO: 将数据转发到目标服务器
            // 这里需要实现与目标服务器的连接和数据转发逻辑
        } catch (Exception e) {
            logger.error("处理服务端数据失败", e);
            ctx.close();
        }
    }

    /**
     * 当发生异常时调用
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        logger.error("客户端连接异常", cause);
        ctx.close();
    }
}